import { run_test } from '../test-harness';

run_test([
  'factor(0)',
  '0',

  'factor(1)',
  '1',

  'factor(2)',
  '2',

  'factor(3)',
  '3',

  'factor(4)',
  '2^2',

  'factor(5)',
  '5',

  'factor(6)',
  '2*3',

  'factor(7)',
  '7',

  'factor(8)',
  '2^3',

  'factor(9)',
  '3^2',

  'factor(10)',
  '2*5',

  'factor(100!)',
  '2^97*3^48*5^24*7^16*11^9*13^7*17^5*19^5*23^4*29^3*31^3*37^2*41^2*43^2*47^2*53*59*61*67*71*73*79*83*89*97',

  'factor(2*(2^30-35))',
  '2*1073741789',

  // x is the 10,000th prime

  // Prime factors greater than x^2 are found using the Pollard rho method

  'a=104729',
  '',

  'factor(2*(a^2+6))',
  '2*10968163447',

  'factor((a^2+6)^2)',
  '10968163447*10968163447', // FIXME should be 10968163447^2

  'factor((a^2+6)*(a^2+60))',
  '10968163501*10968163447', // FIXME sort order

  'f=(x+1)*(x+2)*(y+3)*(y+4)',
  '',

  'factor(f,x,y)',
  '(x+1)*(x+2)*(y+3)*(y+4)',

  'factor(f,y,x)',
  '(x+1)*(x+2)*(y+3)*(y+4)',

  'f=(x+1)*(x+1)*(y+2)*(y+2)',
  '',

  'factor(f,x,y)',
  '(x+1)^2*(y+2)^2',

  'factor(f,y,x)',
  '(x+1)^2*(y+2)^2',

  'factor((x+1)*(-x^2+x+1),x)',
  '-(x^2-x-1)*(x+1)',

  'factor((x+1)*(x^2-x-1),x)',
  '(x^2-x-1)*(x+1)',

  'factor(5*x^3-5)',
  '5*(x-1)*(x^2+x+1)',

  'factor((x+1)*(2x+4))',
  '2*(x+1)*(x+2)',

  'factor(x^8 - 1)',
  '(x-1)*(x+1)*(x^2+1)*(x^4+1)',

  'factor((x-1)*(x+1)*(x^2+1)*(2*x^4+2))',
  '2*(x-1)*(x+1)*(x^2+1)*(x^4+1)',

  'factor((x-1)*(x+1)*(2*x^2+2)*(x^4+1))',
  '2*(x-1)*(x+1)*(x^2+1)*(x^4+1)',

  'factor(x^1 - 1)',
  'x-1',

  'factor(x^2 - 1)',
  '(x-1)*(x+1)',

  'factor(x^3 - 1)',
  '(x-1)*(x^2+x+1)',

  'factor(x^4 - 1)',
  '(x-1)*(x+1)*(x^2+1)',

  'factor(x^5 - 1)',
  '(x-1)*(x^4+x^3+x^2+x+1)',

  'factor(x^6 - 1)',
  '(x-1)*(x+1)*(x^2+x+1)*(x^2+1)',

  'factor(x^7 - 1)',
  '(x-1)*(x^6+x^5+x^4+x^3+x^2+x+1)',

  // irreducible in Z
  'factor(1+x+x^2+x^3+x^4)',
  'x^4+x^3+x^2+x+1',

  'factor(x^4 - 1*x^3 + 4*x^2 + 3*x + 5)',
  '(x^2+x+1)*(x^2-2*x+5)',

  // https://github.com/davidedc/Algebrite/issues/113
  "factor((x^3+x^2+x)*(y^3+y^2),x,y)",
  "x*y^2*(x^2+x+1)*(y+1)",

  // clean up
  'a = quote(a)',
  '',

  'f = quote(f)',
  '',
]);
